package servlets;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import domein.Account;
import domein.AutoTotaalDiensten;
import domein.Bestelling;
import domein.Bestellingen;
import domein.Klant;
import domein.Onderdeel;
import domein.ParkeerPlaats;
import domein.ParkeerTerrein;
import domein.Persoon;
import domein.Voorraad;
/**
 * @author michael
 *
 */
@WebListener
public class MyServletContextListener implements ServletContextListener {

	public void contextInitialized(ServletContextEvent event) {
		Object o1 = loadData("PP.obj");
		Object o2 = loadData("accounts.obj");
		Object o3 = loadData("klanten.obj");
		Object o4 = loadData("onderdelen.obj");
		Object o5 = loadData("bestellingen.obj");
		Object o6 = loadData("benzineVoorraad.obj");
		Object o7 = loadData("dieselVoorraad.obj");
		Object o8 = loadData("gasVoorraad.obj");
		
		if(o1 == null){
			o1 = new HashMap<String, ParkeerPlaats>(); //parkeerplaatsen bestaan niet, maakt nieuw object aan
		}
		if(o2 == null){
			o2 = new HashMap<String, Account>(); //accounts bestaan niet maakt nieuw object aan
		}
		if(o3 == null){
			o3 = new ArrayList<Klant>(); //klanten bestaan niet, maak nieuw object aan
		}
		if(o4 == null){
			o4 = new ArrayList<Onderdeel>(); //onderdelen bestaan niet, maak nieuw object aan
		}
		if(o5 == null){
			o5 = new ArrayList<Bestelling>(); //bestellingen bestaan niet, maak nieuw object aan
		}
		if(o6 == null){
			o6 = new Double(0);
		}
		if(o7 == null){
			o7 = new Double(0);
		}
		if(o8 == null){
			o8 = new Double(0);
		}
		HashMap<String, ParkeerPlaats>  parkeerPlaatsen = (HashMap<String, ParkeerPlaats> ) o1; //cast parkeerplaatsen
		HashMap<String, Account> accounts = (HashMap<String, Account>) o2; //cast accounts
		ArrayList<Persoon> personen = (ArrayList<Persoon>) o3; //cast klanten
		ArrayList<Onderdeel> onderdeel = (ArrayList<Onderdeel>) o4; //cast onderdeel
		ArrayList<Bestelling> bestellingen = (ArrayList<Bestelling>) o5;
		double benzine = (double) o6;
		double diesel = (double) o7;
		double gas = (double) o8;
		AutoTotaalDiensten.setPersonen(personen);
		Voorraad.setOnderdelen(onderdeel);
		AutoTotaalDiensten.setAccounts(accounts);
		ParkeerTerrein.setParkeerPlaatsen(parkeerPlaatsen);
		Bestellingen.setBestellingen(bestellingen);
		Voorraad.setBenzine(benzine);
		Voorraad.setDiesel(diesel);
		Voorraad.setGas(gas);
		
		//vul wat parkeerplaatsen als er geen bestaan
		if (ParkeerTerrein.getParkeerplaatsen().isEmpty()) {
			ParkeerTerrein.addParkeerPlaats("A1", 10.00, "auto");
			ParkeerTerrein.addParkeerPlaats("B1", 55.00, "bus");
			ParkeerTerrein.addParkeerPlaats("C1", 125.00, "vrachtauto");
		}
		
		if (Voorraad.getOnderdelen().isEmpty()) {
			Voorraad.addOnderdeel(20, "Achterbumper", 292.50);
			Voorraad.addOnderdeel(74, "Achterlicht", 125.10);
			Voorraad.addOnderdeel(12, "Airco condensator", 103.13);
			Voorraad.addOnderdeel(10, "Autohoes", 18.99);
			Voorraad.addOnderdeel(48, "Automat", 9.95);
			Voorraad.addOnderdeel(7, "Dakdrager", 19.94);
			Voorraad.addOnderdeel(18, "Draagarm wielophanging", 35.68);
			Voorraad.addOnderdeel(23, "Grille", 67.00);
			Voorraad.addOnderdeel(7, "Kachelradiateur", 168.81);
			Voorraad.addOnderdeel(45, "Knipperlicht, ", 12.95);
			Voorraad.addOnderdeel(90, "Koelvloeistof", 3.99);
			Voorraad.addOnderdeel(46, "Koplamp", 138.37);
			Voorraad.addOnderdeel(9, "Luchtfilter", 17.99);
			Voorraad.addOnderdeel(32, "Motorolie", 6.34);
			Voorraad.addOnderdeel(7, "Oliekoeler", 58.61);
			Voorraad.addOnderdeel(120, "Parkeerschijf", 2.95);
			Voorraad.addOnderdeel(36, "Radiateur", 99.97);
			Voorraad.addOnderdeel(28, "Remcilinder", 55.53);
			Voorraad.addOnderdeel(51, "Remkabels", 11.00);
			Voorraad.addOnderdeel(70, "Ruitenwisserbladen", 33.19);
			Voorraad.addOnderdeel(48, "Schokdempers", 23.74);
			Voorraad.addOnderdeel(29, "Sneeuwkettingen", 33.99);
			Voorraad.addOnderdeel(63, "Trekhaak", 109.06);
			Voorraad.addOnderdeel(33, "Uitlaat", 54.06);
			Voorraad.addOnderdeel(27, "Voorbumper",242.11);
			Voorraad.addOnderdeel(9, "Waterpomp", 39.47);
			Voorraad.addOnderdeel(74, "Zonwering", 6.95);
		}
		
	}

	public void contextDestroyed(ServletContextEvent event) {
		saveData(ParkeerTerrein.getParkeerplaatsen(), "PP.obj");
		saveData(AutoTotaalDiensten.getAccounts(), "accounts.obj");
		saveData(AutoTotaalDiensten.getPersonen(), "klanten.obj");
		saveData(Voorraad.getOnderdelen(), "onderdelen.obj");
		saveData(Bestellingen.getBestellingen(), "bestellingen.obj");
		saveData(Voorraad.getBenzine(), "benzineVoorraad.obj");
		saveData(Voorraad.getDiesel(),  "dieselVoorraad.obj");
		saveData(Voorraad.getGas(), "gasVoorraad.obj");
	} 

	/**
	 * Saved een serialized object
	 * @param object het object dat gesaved moet worden
	 * @param filename filename voor het te saven bestand in de gebruikers homedir
	 */
	public void saveData(Object object, String filename) {
		try {
			FileOutputStream fos = new FileOutputStream(System.getProperty(("user.home")) + System.getProperty(("file.separator")) + filename);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(object);
			oos.close();
		} catch (IOException ioe) {
			System.out.println(ioe.getMessage());
		}
	}

	/**
	 * Laad een object uit een file
	 * @param filename filename voor het te laden bestand in de gebruikers homedir
	 * @return het object uit het bestand, is null wanneer het bestand niet bestaat of leeg is
	 */
	public Object loadData(String filename) {
		Object o = null;
		try {
			FileInputStream fis = new FileInputStream(System.getProperty(("user.home")) + System.getProperty(("file.separator")) + filename);
			ObjectInputStream ois = new ObjectInputStream(fis);
			o = ois.readObject();
		} catch (IOException ioe) {
			System.out.println(ioe.getMessage()); //schrijf exception weg in de console
		} catch (ClassNotFoundException e) {
			System.out.println(e.getMessage()); //schrijf exception weg in de console
		}	
		return o;
	}
}